import java.util.ArrayList;
import java.util.Comparator;
import java.util.PriorityQueue;

public class Main {
    public static int[] smallestK(int[] arr, int k) {
        if(arr == null){
            return null;
        }
        if(k == 0){
            return new int[0];
        }
        PriorityQueue<Integer> queue = new PriorityQueue<>(arr.length);
        for (int i = 0; i < arr.length; i++) {
            queue.add(arr[i]);
        }
        int[] ret = new int[k];
        for (int i = 0; i < k; i++) {
            ret[i] = queue.poll();
        }
        return ret;
    }

    public static void main(String[] args) {

    }
    public static void main4(String[] args) {
        int[] arr = {4,1,9,2,8,0,7,3,6,5};
// 一般在创建优先级队列对象时，如果知道元素个数，建议就直接将底层容量给好
// 否则在插入时需要不多的扩容
// 扩容机制：开辟更大的空间，拷贝元素，这样效率会比较低
        PriorityQueue<Integer> q = new PriorityQueue<>(arr.length);
        for (int e: arr) {
            q.offer(e);
        }
        System.out.println(q.size()); // 打印优先级队列中有效元素个数
        System.out.println(q.peek()); // 获取优先级最高的元素
// 从优先级队列中删除两个元素之和，再次获取优先级最高的元素
        q.poll();
        q.poll();
        System.out.println(q.size()); // 打印优先级队列中有效元素个数
        System.out.println(q.peek()); // 获取优先级最高的元素
        q.offer(0);
        System.out.println(q.peek()); // 获取优先级最高的元素
// 将优先级队列中的有效元素删除掉，检测其是否为空
        q.clear();
        if(q.isEmpty()){
            System.out.println("优先级队列已经为空!!!");
        }
        else{
            System.out.println("优先级队列不为空");
        }
    }

    static class MyCmp implements Comparator<Integer> {

        @Override
        public int compare(Integer o1, Integer o2) {
            return o2 - o1;
        }
    }
    public static void main3(String[] args) {

        PriorityQueue<Integer> queue = new PriorityQueue<>(new MyCmp());
        queue.offer(1);
        queue.offer(4);
        queue.offer(2);
        queue.offer(3);
        System.out.println(queue.peek());
    }
    public static void main2(String[] args) {
        PriorityQueue<Integer> q1 = new PriorityQueue<>();
        PriorityQueue<Integer> q2 = new PriorityQueue<>(100);
        ArrayList<Integer> array = new ArrayList<>();
        array.add(1);
        array.add(2);
        PriorityQueue<Integer> q3 = new PriorityQueue<>(array);

        System.out.println(q3.size());
        System.out.println(q3.peek());
    }
    public static void main1(String[] args) {
        int[] array = {27,15,19,18,28,34,65,49,25,37};
        MyPriorityQueue myPriorityQueue = new MyPriorityQueue(array);
        myPriorityQueue.initElem(array);
        myPriorityQueue.createHeap();
        myPriorityQueue.offer(10);
        myPriorityQueue.offer(60);
        System.out.println(myPriorityQueue.poll());
        System.out.println(myPriorityQueue.poll());
    }
}